package com.latamcloud.socket.webserver;

import java.io.*;
import java.net.*;
import java.util.*;

class WebServer
{
 public static void main (String args[]) throws Exception
  {
   String requestMessageLine;
   String fileName;

   // check if a port number is given as the first command line argument
   // if not argument is given, use port number 6789
   int myPort = 6789;
   if (args.length > 0)
     {
      try {
	   myPort = Integer.parseInt(args[0]);
	  } 
      catch (ArrayIndexOutOfBoundsException e) 
          {
	   System.out.println("Need port number as argument");
	   System.exit(-1);
	  } 
      catch (NumberFormatException e) 
          {
	   System.out.println("Please give port number as integer.");
	   System.exit(-1);
	  }
     }

   // set up connection socket
   ServerSocket listenSocket = new ServerSocket (myPort);

   // listen (i.e. wait) for connection request
   System.out.println ("Web server waiting for request on port " + myPort);
   Socket connectionSocket = listenSocket.accept();

   // set up the read and write end of the communication socket
   BufferedReader inFromClient = new BufferedReader (
                 new InputStreamReader(connectionSocket.getInputStream()));
   DataOutputStream outToClient = new DataOutputStream (
                 connectionSocket.getOutputStream());

   // retrieve first line of request and set up for parsing
   requestMessageLine = inFromClient.readLine();
   System.out.println ("Request: " + requestMessageLine);
   StringTokenizer tokenizedLine = new StringTokenizer(requestMessageLine);

   // check for GET request
   if (tokenizedLine.nextToken().equals("GET"))
     {
      fileName = tokenizedLine.nextToken();

      // remove leading slash from line if exists
      if (fileName.startsWith("/") == true)
          fileName = fileName.substring(1);

      // access the requested file
      File file = new File(fileName);

      // convert file to a byte array
      int numOfBytes = (int) file.length();
      FileInputStream inFile = new FileInputStream (fileName);
      byte[] fileInBytes = new byte[numOfBytes];
      inFile.read(fileInBytes);

      // Send reply 
      outToClient.writeBytes ("HTTP/1.0 200 Document Follows\r\n");
      if (fileName.endsWith(".jpg"))
          outToClient.writeBytes ("Content-Type: image/jpeg\r\n");
      if (fileName.endsWith(".gif"))
          outToClient.writeBytes ("Content-Type: image/gif\r\n");
      outToClient.writeBytes ("Content-Length: " + numOfBytes + "\r\n");
      outToClient.writeBytes ("\r\n");
      outToClient.write(fileInBytes, 0, numOfBytes);

      // read and print out the rest of the request
      requestMessageLine = inFromClient.readLine();
      while (requestMessageLine.length() >= 5)
         {
          System.out.println ("Request: " + requestMessageLine);
          requestMessageLine = inFromClient.readLine();
         }
      System.out.println ("Request: " + requestMessageLine);

      connectionSocket.close();
     }
   else
     {
      System.out.println ("Bad Request Message");
     }
  }
}